﻿
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using SmartPlant.Model.DbContext;
using SmartPlant.Model.DbContext.Biz;
using SqlSugar;

namespace SmartPlant.Model.Biz
{


    /// <summary>
    /// 用于UI列之类的
    /// </summary>
    public class ViewQueryItemAttr
    {
        public ViewQueryItemAttr()
        {
            width = 100;
            WPF_IsGroup = false;
            WPF_DATATYPE = "string";
            IsDisplayed = 1;
            WPF_IsDropDown = false;
        }

        ///// <summary>
        ///// 
        ///// </summary>
        //[SugarColumn(IsIgnore = true)]
        //public Itemattributions Itemattribution { get; set; }

        public ViewQueryItemAttr? UoM { get; set; }

 

 

        /// <summary>
        /// 可以认为是属性的ID值（主键）
        ///</summary>
        public decimal ItemattributionId { get; set; }

        /// <summary>
        /// 列的先后顺序。GetIndexDefaultColumns接口返回时，默认可见的是从1开始。其他的不可见的为0。
        /// 对应<see cref="DynamicPropertyInfo.Order"/> 和 <see cref="GridViewColumn.DisplayIndex"/>
        ///</summary>
        public decimal? SeqNum { get; set; } = 0;

 
 
 

        /// <summary>
        ///  显示名。如果为空，则去显示originDisplayName
        ///</summary>
        public string DisplayName { get; set; }

        /// <summary>
        /// 是否显示。1代表显示。0代表不显示。 
        /// 对应<see cref="DynamicPropertyInfo.IsVisible"/> 和 <see cref="GridViewColumn.IsVisible"/>
        ///</summary>
        public decimal? IsDisplayed { get; set; }
 

 

        #region 1-----------------------------------------------------------

 
 
 

        /// <summary>
        /// 真正要更新的column。如loop_id。给前端用的属性名有另外一个<see cref="WPF_UniqueName"/>。（不能删，ede更新要用）
        /// <see cref="Uniqueatts.UniqueName"/>。对应<see cref="CellColMap.SPIColName"/>
        /// </summary>
        public string SPIColName { set; get; }

        /// <summary>
        /// 即这个属性真正要更新的表的位置。(不能删，ede更新要用）
        /// <see cref="Entities.EntityName"/>，对应<see cref="CellColMap.SPITableName"/>
        /// </summary>
        public string SPITableName { set; get; }




        /// <summary>
        /// attributes下的类型。L和E开头的是下拉列表，列表值在DropDownList里
        /// </summary>
        public string ATTRIBUTE_DATATYPE { set; get; }











        ///// <summary>
        ///// 给前端用的，如果是下拉列表，这里就是列表值的内容。
        ///// </summary>
        //[SugarColumn(IsIgnore = true)]
        //public List<DropDownListObj> DropDownList { get; set; }





        #endregion

        #region WPF端，动态gridview渲染会用到的  
        /// <summary>
        /// <see cref="Itemattributions.Displayname"/>。如果displayname没有，则显示这个
        /// </summary>
        public string OrigDisplayName { set; get; }

        /// <summary>
        /// 给前端用的类型（前端会依靠这个创建动态类），所以必须是c#语法认识的那些类型（如string，int，double等）
        /// </summary>
        public string WPF_DATATYPE { set; get; }

        /// <summary>
        /// 给前端用的宽度，默认100
        /// </summary>
        public int width { set; get; }

        /// <summary>
        /// 给前端用的<see cref="Itemattributions.Readonlymask"/>。3表示不能编辑。0代表可以编辑
        /// </summary>
        public string WPF_readonlymask { set; get; }

        /// <summary>
        /// 给前端用的，用于指示是否为下拉
        /// </summary> 
        public bool WPF_IsDropDown { get; set; }

        // <see cref="Uniqueatts.UniqueName"/>。对应<see cref="CellColMap.SPIColName"/>
        /// <summary>
        /// 查询时用的sql语句里的column名就是这个。
        /// 给前端用的属性名（前端会依靠这个创建动态类），所以必须是c#语法认识的合法命名
        /// </summary> 
        public string WPF_UniqueName { get; set; }

        /// <summary>
        /// 给前端用的，是否分组
        /// </summary> 
        public bool WPF_IsGroup { get; set; }

        /// <summary>
        /// 给前端用的，是否为主键，在提交时组成<see cref="SPIPatchObj.Id"/>
        /// </summary> 
        public bool PrimaryKey { get; set; } = false;
        #endregion
    }

    public class DropDownListObj : INotifyPropertyChanged
    {
        public string Id { get; set; }
        public string Name { get; set; } = "";
        public string Desc { get; set; } = "";

        public bool isModified { get; set; } = false;
        private bool isSelected = false;

        public event PropertyChangedEventHandler PropertyChanged;

        public bool IsSelected
        {
            get { return isSelected; }
            set
            {
                isSelected = value;
                RaisePropertyChanged();
            }
        }
        protected internal void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            OnPropertyChanged(propertyName);
        }

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if (propertyChanged != null)
            {
                PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
                propertyChanged(this, e);
            }
        }
    }

 
    /// <summary>
    /// 存放会用到的下拉（包括enum和lookup类型）
    /// </summary>
    public class DropDownLists
    {
        /// <summary>
        /// enum or lookup or uom
        /// </summary>
        public string type { get; set; }
        /// <summary>
        /// L1804 E2032
        /// </summary>
        public string ATTRIBUTE_DATATYPE { get; set; }

        public List<DropDownListObj> DropDownList { get; set; } = new List<DropDownListObj>();
    }
}
